package org.darcy.framework.blog.holder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RequestHolder {

	/**
	 * 将RequestAttributes对象设置为子线程共享
	 */
	public static void setShare() {
		ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		RequestContextHolder.setRequestAttributes(sra, true);
	}

	/**
	 * 获取request
	 *
	 * @return HttpServletRequest
	 */
	public static HttpServletRequest getRequest() {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return null;
		}
		return servletRequestAttributes.getRequest();
	}

	/**
	 * 获取Response
	 *
	 * @return HttpServletRequest
	 */
	public static HttpServletResponse getResponse() {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return null;
		}
		return servletRequestAttributes.getResponse();
	}

	/**
	 * 获取session
	 *
	 * @return HttpSession
	 */
	public static HttpSession getSession() {
		// log.debug("getSession -- Thread id :{}, name : {}",
		// Thread.currentThread().getId(),
		// Thread.currentThread().getName());
		HttpServletRequest request = null;
		if (null == (request = getRequest())) {
			return null;
		}
		return request.getSession();
	}

	/**
	 * 获取session的Attribute
	 *
	 * @param name session的key
	 * @return Object
	 */
	public static Object getSession(String name) {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return null;
		}
		return servletRequestAttributes.getAttribute(name, RequestAttributes.SCOPE_SESSION);
	}

	/**
	 * 添加session
	 *
	 * @param name
	 * @param value
	 */
	public static void setSession(String name, Object value) {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return;
		}
		servletRequestAttributes.setAttribute(name, value, RequestAttributes.SCOPE_SESSION);
	}

	/**
	 * 清除指定session
	 *
	 * @param name
	 * @return void
	 */
	public static void removeSession(String name) {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return;
		}
		servletRequestAttributes.removeAttribute(name, RequestAttributes.SCOPE_SESSION);
	}

	/**
	 * 获取所有session key
	 *
	 * @return String[]
	 */
	public static String[] getSessionKeys() {
		ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder
				.getRequestAttributes());
		if (null == servletRequestAttributes) {
			return null;
		}
		return servletRequestAttributes.getAttributeNames(RequestAttributes.SCOPE_SESSION);
	}
}
